package com.example.demo.netty.server;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.nio.charset.StandardCharsets;

public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    /**
     * 有新的客户端连接成功时调用这个
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        super.channelActive(ctx);
    }

    /**
     * 读取事件会调用这个方法处理
     * @param ctx 上下文对象,里面有SocketChannel和Pipeline的对象
     *            这个对象说白了就是包含了你操作所需要的一切对象
     *            比如通过channel方法获得channel对象pipeline拿到pipeline对象
     *            或者通过close关闭当前channel等
     * @param msg 客户端传来过的数据
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 转为ByteBuf对象方便处理
//        ByteBuf byteBuf =(ByteBuf) msg;
//        System.out.println(byteBuf.toString(StandardCharsets.UTF_8));
        System.out.println((String)msg );
    }

    /**
     * 返回给客户端的数据
     * @param ctx 上下文
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 写入返回数据并刷新
        ctx.writeAndFlush("hello client");
    }

    /**
     * 异常处理,如果有异常就在这里处理掉
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 这里做演示，输出异常信息并关闭这个通道
        System.out.println(cause.getMessage());
        ctx.close();
    }
}
